原码,反码,补码,移码的表示范围以及数据溢出 | 您所在的位置:网站首页 › 补码 表示范围 › 原码,反码,补码,移码的表示范围以及数据溢出 |
1.表示范围:
假设二进制机器字长是n+1位,且为整数 原码表示的范围: −(-1)≤ x ≤-1 反码表示的范围: −(-1)≤ x ≤-1 补码表示的范围: −≤ x ≤-1 移码表示的范围: −≤ x ≤-1 移码的符号位中0表示负数,1表示正数,简单来说,原码的补码数值位不变,符号位取反就是移码。 对于8位寄存器: 原码表示范围为 -127-127,即1111 1111~0111 1111 反码表示范围为 -127-127,即1000 0000~0111 1111 补码表示范围为 -128-127,即1000 0000~0111 1111 移码表示范围为 -128-127,即0000 0000~1111 1111 2.数据溢出:方法总结: ① 如果超过该范围的最大值,正值,那么使用该数值减去 (n是多少bit 1字节=8bit 2字节=16bit),例如200,超过了127,则200-=-56 在该区间内,输出-56 例如500,超过了127,则500-256=244,不在该区间,继续减去256,244-256=-12,在该区间内,输出-12 ② 如果超过该范围的最小值,负值,那么使用该数值加上 (n是多少bit 1字节=8bit 2字节=16bit),例如-200,超过了最小值,则-200+=56 在该区间内,输出56 例如-600,超过了-127,则-600+256=-344,不在该区间,继续+256,-344+256=-88,在该区间内,输出-88 3.例题分析:例题1(期末考试题): 若寄存器内容为00000000,若它等于-128,则为( C ) A. 原码 B. 补码 C. 移码 D. 反码 解题: 符号位为0,所以ABD即原码、反码、补码为正数,正数的原码、反码、补码相同,转换为十进制为0; 移码的符号位中0表示负数,00000000即为-128,由于-128超出8位寄存器原码和反码的范围,所以计算-128的时候不能使用符号位不变数值位取反加一,需要特殊记。 例题2(某公司笔试题): 下列代码的运行结果(B) short i = 65537; int j = i + 1; printf(“i = % d, j = % d\n”, i, j); A i=65537,j=65538 B i=1,j=2. C i=-1,j=0 D i=1,j=65538 解题: short为16位,表示范围为(补码):−≤ x ≤-1 int为32位,表示范围为(补码):−≤ x ≤-1 i = 65537,超出最大表示范围,使用上述我讲的方法计算,则 65537-=1; 根据程序自上而下执行,i = 1, j = i + 1 = 2,所以选B。 例题3(期末考试题): 设机器数采用补码表示(含1位符号位),若寄存器内容为9BH,则对应的十进制数为( D ) A. -97 B. -101 C. -27 D. 155 解题: 方法一:9BH转化为十进制为155,因为8位寄存器补码表示范围为 -128-127,溢出,使用上述我讲的方法计算,则155 - = -101; 方法二:9BH转化为二进制为10011011,补码10011011转为原码为11100101,转换为十进制为-101; |
CopyRight 2018-2019 实验室设备网 版权所有 |